package com.roy;

import java.sql.SQLOutput;

/**
 * @author xiaoxiaokui
 * @date 2021/11/21
 *
 * 1、java的类加载体系
 * Bootstrap Classloader > ExtClassLoader > AppClassloader
 * 每种类加载器都有它自己的加载目录
 *
 * 2、双亲委派：一个java类加载进JVM内存的过程
 *    每个类加载器堆它加载过的类都有一个缓存
 *    向上委托查找，向下委托加载
 *
 * 3、jdk类加载对象
 *    ClassLoader-> SecureClassLoader -> URLClassLoader -> ExtClassLoder,AppClassLoader
 */
public class ClassLoaderDemo1 {

    public static void main(String[] args) throws ClassNotFoundException {
        // 父子关系 AppClassLoader <- ExtClassLoader <- BootStrap Classloader
        ClassLoader cl1 = ClassLoaderDemo1.class.getClassLoader();
        System.out.println("cl1 > " + cl1);
        System.out.println("parent of cl1 > " + cl1.getParent());
        // BootStrap Classloader由c++开发，是JVM虚拟机的一部分，本身不是java类
        System.out.println("grant parent of cl1 > " + cl1.getParent().getParent());
        // String,Int等基础类由BootStrap Classloader加载
        ClassLoader cl2 = String.class.getClassLoader();
        System.out.println("cl2 > " + cl2);
        System.out.println(cl1.loadClass("java.util.List").getClass().getClassLoader());

        // java指令可以通过增加-verbose:class -verbose:gc 参数在启动时打印出类加载情况
        // Bootstrap Classloader 加载java基础类。这个属性不能在java指令中指定，推断不是由java语言处理
        System.out.println("Bootstrap Classloader加载目录：" + System.getProperty("sun.boot.class.path"));
        // Extention ClassLoader 加载JAVA_HOME/ext下的jar包，可通过-D java.ext.dirs另行指定目录
        System.out.println("Extention ClassLoader加载目录：" + System.getProperty("java.ext.dirs"));

        // AppClassLoader 加载CLASSPATH，应用下的jar包，可通过-D java.class.path另行指定目录
        System.out.println("AppClassLoader加载目录：" + System.getProperty("java.class.path"));
    }
}
